import org.junit.Test;
import org.junit.experimental.theories.suppliers.TestedOn;

import java.util.Arrays;

/**
 * 数组 Array
 * 数组相当于一堆相同数据类型的数据
 *
 */
public class 数组 {
   //1.数组定义：4种，创建数组初始化【静态初始化：给定值|动态初始化：】
    @Test
     public void testArray() {
        //注意：数组定义长度：不能改变
        int[] arr1 = new int[4];//JAVA推荐写法  动态初始化
        int arr2[]=new int[4];//C推荐写法JAVA兼容 动态初始化
        int[] arr3={1,2,3};//静态初始化数组 元素可以直接使用
        int[] arr4=new int[]{1,2,3};//动态初始化
        //数组：内部存数据叫做元素：
        //从arr3中取出2的元素    数组名 下标
        System.out.println(arr3[0]);
        //从arr3的长度
        System.out.println(arr3.length);
        //从arr4中获取第四个元素值  数组下标超界异常：下标超出数组长度范围
        //System.out.println(arr4[4]);//报错：ArrayIndexOutOfBoundsException
    }
    /**
     * 数组的迭代（遍历：输出数组所有元素值）三种
     * 1.普通迭代方式：for
     * 2.增强for方式：推荐.JDK1.5之后
     * 3.工具类：Arrays
     *
     *
     */
    @Test
    public void testIterate(){
        int[] arr={1,2,3,4};//静态初始化数组
//         for(int i=0;i<arr.length;i++){ //拿数组下标
//        System.out.println(arr[i]);
//       }
         //增强for.JDK1.5  遍历数组的目的：拿元素值 ;相同类型才可以拿元素值。
//        for (int j:arr){ //增强for语法（遍历数据类型 引用：数组名）
//            System.out.println(j);
//        }
        //工具类：Arrays.toString()直接打印数组元素值
        System.out.println(Arrays.toString(arr));
    }
    /**
     * 数组扩容：数组的长度是固定的，不可改变【可以使用扩容】
     *
     */
     @Test
    public  void testCopy(){
         //字符数组，数组长度固定：2个
         char[] arr={'唐','山'}; //想法：长度增加4个
         //扩容：增加4个    克隆新的数组
         char[] temp=Arrays.copyOf(arr,4); //属型名：属型值
         arr=temp;
         arr[2]='工';
         arr[3]='业';
         System.out.println(arr);
         //需求：输出唐山工业


     }
    /**
     * 数组输出元素时，会有一些不同【查看数据是否是数组】
     * 数据类型：基础数据类型+引用类型
     */
    @Test
    public void testArrays(){
        //字符数组
        char[] china={'中','国'};
        System.out.println(china); //输出：中国  字符串：字符数组
        //输出语句--JAVAOOP面向对象：重载，字符自动拼接
        //数值数组
        int[] i={1,2};
        System.out.println(i);//输出：[ I数据类型 @链接符 3d82c5f3地址值
    }
    /**
     * 冒号排序：双for循环的使用：外层for执行一次，内层for执行全部
     */
    @Test
   public  void bubbleSort(){
        //静态初始化数组
        int[] arr={3,6,4,1}; //升序1,3,4,6
        //外层for控制轮  i=0 1 2   3轮
        for(int i=0;i< arr.length-1;i++){
          //②内层for控制次  j=3轮递减-1次
            for(int j=0;j< arr.length-1-i;j++){
                //③交换：第一个元素比第二个元素大，条件成立：交换【升序】
                if(arr[j]>arr[j+1]){//【相邻元素】 数组名加【下标】
                    //创建一个第三方数组，接收  变量名\数组名：temp
                    int temp=arr[j]; //大的元素交给第三方变量保存
                    arr[j]=arr[j+1];//第二个元素换个第一个元素位置
                    arr[j+1]=temp;//保存第三方变量【大数】交给第二个元素

                }
            }

        }
        System.out.println(Arrays.toString(arr));//输出数组【遍历数组】
    }
    @Test
    public void testSort(){
        int[] arr={3,6,4,1};
        //工具类 Arrays.sort()方法排序，默认升序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
